use rand::Rng;
use uuid::{Uuid, uuid, Version};

fn main() {
    // 创建一个随机数生成器的句柄
    let mut rng = rand::thread_rng();
    // 生成一个随机结果，根据返回值类型推断
    // 生成一个正数
    let num: u32 = rng.gen();
    println!("生成一个正数: {}", num);
    // 生成一个布尔值
    let result: bool = rng.gen();
    println!("生成一个布尔值: {}", result);
    // 从指定范围内获取一个，默认左闭右开，
    let data1 = rng.gen_range(0..6);
    // 可以使用等于号 = 来包含右边的值，变成左闭右闭
    let data2 = rng.gen_range(0..=6);
    println!("从指定范围内获取一个数，右开: {}", data1);
    println!("从指定范围内获取一个数，右闭: {}", data2);

    // rng.gen() 的返回值类型会自行推断
    if rng.gen() {
        println!("{}", "使用rng的gen方法随机生成一个布尔值")
    }

    // 生成一个6位数验证码
    let code = generate_sms_code();
    println!("生成一个6位数验证码: {}", code);


    // 生成一个UUID
    let uuid = generate_uuid();
    println!("生成的UUID: {}", uuid);
}

// 生成一个6位数的验证码
fn generate_sms_code() -> String {
    let mut rng = rand::thread_rng();
    let sms_code: String = (0..6)
        .map(|_| rng.gen_range(0..=9).to_string())
        .collect();

    sms_code
}

// 生成一个UUID，使用参考 https://docs.rs/uuid/1.10.0/uuid/
// 注意：生成的UUID是随机的，每次运行程序都会生成一个新的UUID
fn generate_uuid() -> String {
    // 需要启用 feature = "v4" 才能使用 v4 算法生成随机的 UUID
    let uuid = Uuid::new_v4();
    // UUID 的版本，表示生成算法。常用的生成算法有 MD5 对于随机生成的 UUID，版本为 Version::Random
    // get_version 返回 UUID 的版本。
    assert_eq!(Some(Version::Random), uuid.get_version());
    // assert_eq!(Some(Version::Md5), uuid.get_version());
    // assert_eq!(Some(Version::Sha1), uuid.get_version());
    println!("生成的UUID: {}", uuid);

    // 也可以使用 uuid! 宏，在编译时从字符串文本中解析 Uuid。
    const ID: Uuid = uuid!("67e55044-10b1-426f-9247-bb680e5fe0c8");

    // 从带有可选连字符的十六进制数字字符串中分析 Uuid。
    // 也可以使用 parse_str 方法解析 UUID
    let my_uuid = Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8").unwrap();
    println!("解析的UUID: {}", my_uuid);
    assert_eq!(Some(Version::Random), my_uuid.get_version());

    uuid.to_string()
}

/*
v1 - 使用时间戳和单调计数器的第 1 版 UUID。
v3 - 基于某些数据的 MD5 哈希值的第 3 版 UUID。
v4 - 使用随机数据的第 4 版 UUID。
v5 - 基于某些数据的 SHA1 哈希值的第 5 版 UUID。
v6 - 使用时间戳和单调计数器的第 6 版 UUID。
v7 - 使用 Unix 时间戳的第 7 版 UUID。
v8 - 使用用户定义数据的第 8 版 UUID。
*/